//
//  NativeComponent.m
//  UIKit
//
//  Created by TywinZhang on 15/12/23.
//  Copyright © 2015年 Facebook. All rights reserved.
//

#import "NativeComponent.h"
#import "RCTLog.h"
#import "RCTConvert.h"
#import <UIKit/UIKit.h>
#import <EventKit/EventKit.h>
@implementation NativeComponent
/*
  为了实现RCTBridgeModule协议，你的类需要包含RCT_EXPORT_MODULE()宏。这个宏也可以添加一个参数用来指定在Javascript中访问这个模块的名字。如果你不指定，默认就会使用这个Objective-C类的名字。
 */
RCT_EXPORT_MODULE();


/*
  你必须明确的声明要给Javascript导出的方法，否则React Native不会导出任何方法。声明通过RCT_EXPORT_METHOD()宏来实现：
 */
RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
{
  RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);
  
  //事件市场
  EKEventStore *eventStore = [[EKEventStore alloc] init];
  
  //6.0及以上通过下面方式写入事件
  if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
  {
    // the selector is available, so we must be on iOS 6 or newer
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
      dispatch_async(dispatch_get_main_queue(), ^{
        if (error)
        {
          //错误细心
          // display error message here
        }
        else if (!granted)
        {
          //被用户拒绝，不允许访问日历
          // display access denied error message here
        }
        else
        {
          // access granted
          // ***** do the important stuff here *****
          
          //事件保存到日历
          
          
          //创建事件
          EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
          event.title     = name;
          event.location = location;
          
          NSDateFormatter *tempFormatter = [[NSDateFormatter alloc]init];
          [tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];
          
          event.startDate = [[NSDate alloc]init ];
          event.endDate   = [[NSDate alloc]init ];
          event.allDay = YES;
          
          //添加提醒
          [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -60.0f * 24]];
          [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -15.0f]];
          
          [event setCalendar:[eventStore defaultCalendarForNewEvents]];
          NSError *err;
          [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
          
          
          
          UIAlertView *alert = [[UIAlertView alloc]
                                initWithTitle:@"提示"
                                message:@"事件添加成功，请在手机自带日历软件中查看"
                                delegate:nil
                                cancelButtonTitle:@"Okay"
                                otherButtonTitles:nil];
          [alert show];
          
          NSLog(@"保存成功");
          
        }
      });
    }];
  }
}

/*
  多参数推荐使用Dictionary进行包装
 
 注意: 关于数组和映射
 
 Objective-C并没有提供确保这些结构体内部值的类型的方式。你的原生模块可能希望收到一个字符串数组，但如果Javascript在调用的时候可能提供了一个混合number和string的数组，你会收到一个NSArray，里面既有NSNumber也有NSString。对于数组来说，RCTConvert提供了一些类型化的集合，譬如NSStringArray或者UIColorArray，你可以用在你的函数声明中。对于映射而言，开发者有责任自己调用RCTConvert的辅助方法来检测和转换值的类型。
 */
RCT_EXPORT_METHOD(addMoreEvent:(NSString *)name location:(NSString *)location details:(NSDictionary *)detail)
{
  RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);
  RCTLogInfo(@"detail data is ===>\n name:%@ time:%@",[RCTConvert NSString:detail[@"name"]],[RCTConvert NSString:detail[@"Time"]]);
  //给JavaScript发送一个事件
  //[self.bridge.eventDispatcher sendAppEventWithName:@"aMethod" body:@{@"name":@"Tom",@"age":@12}];
  
}

RCT_EXPORT_METHOD(callBackEvent:(RCTResponseSenderBlock)callback)
{
  /*
   RCTResponseSenderBlock只接受一个参数——传递给JavaScript回调函数的参数数组。在上面这个例子里我们用Node.js的常用习惯：第一个参数是一个错误对象（没有发生错误的时候为null），而剩下的部分是函数的返回值。
   */
  NSArray *events = @[@"test1",@"test2"];
  callback(@[[NSNull null], events]);
  
}

//导出常量
- (NSDictionary *)constantsToExport
{
  return @{ @"firstDayOfTheWeek": @"Monday" };
}
@end
